package cn.ycc1.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author ycc
 * 标注为springboot应用启动类 主入口
 * @Target({ElementType.TYPE})
 * @Retention(RetentionPolicy.RUNTIME)
 * @Documented
 * @Inherited
 * @SpringBootConfiguration 配置类（就如配置文件 配置类也是容器中的组件 @Component）
 * @EnableAutoConfiguration 开启自动配置功能（@AutoConfigurationPackage 自动配置包）
 * @ComponentScan(
 *     excludeFilters = {@Filter(
 *     type = FilterType.CUSTOM,
 *     classes = {TypeExcludeFilter.class}
 * ), @Filter(
 *     type = FilterType.CUSTOM,
 *     classes = {AutoConfigurationExcludeFilter.class}
 * )}
 * )
 *
 * @AutoConfigurationPackage
 * @Import({AutoConfigurationPackages.Registrar.class}) 将主配置类（@Configuration）所在包及子包的所有组件扫描到Spring容器
 *
 * @Import({AutoConfigurationImportSelector.class}) 自动配置导入选择器 自动配置类生效，就可以帮我们完成自动配置工作
 *
 * public String[] selectImports(AnnotationMetadata annotationMetadata) 通过这个方法获取需要导入的组件
 * List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
 * configurations = this.removeDuplicates(configurations); 获取到需要导入的配置类
 * 有了自动配置类，免去了自动配置工作
 * String location = String.format("META-INF/spring/%s.imports", annotation.getName()); 自动配置类的位置
 */
@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }
}
